/*
 * @Author: yuanmanxue <yuanmanxue>
 * @Date:   2017-12-12 04:49:14
 * @Last modified by:   yuanmanxue
 * @Last modified time: 2017-12-13 11:42:38
 */

function Observer (data) {
    // 获取vm实例的data
    this.data = data;
    // 所以的data数据进行监听
    this.walk(data);
}

Observer.prototype = {
    walk: function (data) {
        var self = this;
        // 所以的data数据进行监听
        Object.keys(data).forEach(function (key) {
            self.defineReactive(data, key, data[key]);
        });
    },
    //监听 维护dep观察者列表
    defineReactive: function (data, key, val) {
      // dep观察者列表
        var dep = new Dep();
        //如果这个对象的子对象是一个对象的话，就递归调用 继续监听
        var childObj = observe(val);
        Object.defineProperty(data, key, {
            enumerable: true,
            configurable: true,
            // get的时候添加观察者
            get: function getter () {
                // Dep.target就是watcher的实例，添加到观察者列表Dep中去
                console.log(Dep.target);
                if (Dep.target) {
                    dep.addSub(Dep.target);
                }  
                return val;
            },
              // 通知所有的观察者列表
            set: function setter (newVal) {
                if (newVal === val) {
                    return;
                }
                val = newVal;
                dep.notify();
            }
        });
    },
};
// 递归data然后监听数据是否变化
function observe (value, vm) {
    if (!value || typeof value !== 'object') {
        return;
    }
    return new Observer(value);
}

function Dep () {
    this.subs = [];
}
Dep.prototype = {
    addSub: function (sub) {
        this.subs.push(sub);
    },
    notify: function () {
        this.subs.forEach(function (sub) {
            sub.update();
        });
    },
};
Dep.target = null;
